package collection;

import java.nio.channels.Pipe;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

/**
 * 排序的自定义类型
 */
public class SorListDemo2 {
    public static void main(String[] args) {
        List<Point> list=new ArrayList<>();
        list.add(new Point(1,2));
        list.add(new Point(234,22));
        list.add(new Point(34,43));
        list.add(new Point(45,24));

        System.out.println(list);

        /*
        sort方法要求集合元素必须实现:Comparable接口,否则编译不通过
        注意:
        当我们使用sort方法对集合排序时,如果该集合要求元素必须实现Comparable接口,而该元素
          没有实现时,则不再使用该sort方法.
            原因:
            因为该方法对我们的代码具有侵入性

            侵入性:
            当我们使用某个API功能时,该功能要求我们为其修改额外代码,那么这种现象就称为侵入性.
            侵入性不利于后期代码维护,应当尽量避免.
         */
      //使用匿名内部类修饰创建比较规则
 //       Comparator<Point> comparator=new Comparator<Point>() {
   //         @Override
     //       public int compare(Point o1, Point o2) {
       //         int ol1=o1.getX()* o1.getX()+ o1.getY()* o1.getY();
         //       int ol2= o2.getX()* o2.getX()+ o2.getY()* o2.getY();
           //     return ol1-ol2;
       //     }
        //};
      //  Collections.sort(list,comparator);

        //方法二,可以否则侵入性
        Collections.sort(list,new Comparator<Point>() {
                     @Override
                   public int compare(Point o1, Point o2) {
                    int ol1=o1.getX()* o1.getX()+ o1.getY()* o1.getY();
                   int ol2= o2.getX()* o2.getX()+ o2.getY()* o2.getY();
                 return ol1-ol2;
                 }
            }
        );

        System.out.println(list);
    }
}



/*class MyComparator implements Comparator<Point>{

    @Override
    *//**
 *  compare方法用于定义o1与o2的大小关系.
 *  返回值:
 *  当返回值>0时,表示o1>o2,即o1应该排在o2之后。
 *  当返回值<0时,表示o1<o2即o1应该排在o2之前。
 *  当返回值=0时,表示o1=o2
 *//*
    public int compare(Point o1, Point o2) {
        //计算o1点到原点的距离
        int olen1 = o1.getX()*o1.getX()+o1.getY()* o1.getY();
        //计算o2点到原点的距离
        int olen2 = o2.getX()*o2.getX()+o2.getY()* o2.getY();
        return olen1-olen2;
    }
}*/
